package Java基础.变量;

public class 浮点运算为什么会不准确 {
	
	public static void main(String[] args) {
		
		float f = 2.2f;
        double d = (double)f;
        System.out.println(d);
        //结果："2.200000047683716"
        
        f = 2.25f;
        d = (double)f;
        System.out.println(d);
        //结果："2.2500000000000"

        //2.25 - 2.2 = 0.05 ( 但实际结果不是0.05 )
        float f2 = 2.25f - 2.2f;
        System.out.println(f2);
        //结果："0.049999952"
        
/**
 2.2按照乘2取整法转化为二进制的时候,算术如下

   0.2×2=0.4，所以二进制小数第一位为0.4的整数部分0；

   0.4×2=0.8，第二位为0.8的整数部分0；

   0.8×2=1.6，第三位为1；

   0.6×2=1.2，第四位为1；

   0.2×2=0.4，第五位为0；
  
   ...
   
  这样永远也不可能乘到=1.0，得到的二进制是一个无限循环的排列 00110011001100110011...

  在32位存储的表示方式是(位数部分截断多余的)
 
  0 1000 0001 001 1001 1001 1001 1001 1001 

  但是这种存储方式，换算成十进制的值，却不会是2.2
 
  从而得出原因 :
 
   因为在十进制转换为二进制的时候可能会不准确（如：2.2），这样就导致了误差问题！

   所以计算机在存储小数的时候都会不可避免的存在误差,也就是存的二进制码不够准确,因为

   无法表示无限循环小数.所以存在误差.从而,只要是小数运算,都会存在误差.平时我们程序里看到

   的小数运算发现末尾有一堆数字就是这个原因.
 */
        
	}
	
	
}
